package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	const N = 20
	var values [N]string
	cond := sync.NewCond(&sync.Mutex{})
	for i := 0; i < N; i++ {
		d := time.Second * time.Duration(rand.Intn(10)) / 10
		// 20个英文字母 a-t
		go func(i int) {
			time.Sleep(d) // 休眠最短的 goroutine 首先通知 主 goroutine继续向下执行
			cond.L.Lock()
			values[i] = string('a' + i)
			cond.Broadcast()
			cond.L.Unlock()

		}(i)
	}

	checkCondition := func() bool {
		fmt.Println(values)
		for i := 0; i < N; i++ {
			if values[i] == "" { // 如果一个 goroutine 睡眠过长，其 index 的 值可能为 数组内元素的零值 ""
				return false // 表明还有 子 goroutine 未生产出字母
			}
		}
		return true

	}
	cond.L.Lock()
	defer cond.L.Unlock()
	for !checkCondition() { // 如果 数组中发现空字符串
		cond.Wait() // 主 goroutine 堵塞
	}

}
